package cn.edu.neu.lab603.cloudeval.strategy.policy

import cn.edu.neu.lab603.cloudeval.entity.{DataCenter, PhysicalMachine => Host, VirtualMachine => VM}

/** 物理机的选择策略。
  *
  * Created by yfwz100 on 2016/11/3.
  */
trait HostSelectionPolicy {

  /** 获取待迁移主机列表。
    *
    * @param dataCenter 数据中心
    * @return 物理主机列表
    */
  def getHostsToMigrate(implicit dataCenter: DataCenter): Iterable[Host]

  /** 根据虚拟机获取适合放置该虚拟机的主机列表。
    *
    * @param vm         虚拟机
    * @param dataCenter 数据中心
    * @return 物理主机
    */
  def getHostForPlacement(vm: VM)(implicit dataCenter: DataCenter): Host

  /** 获取需要关闭的物理主机列表。
    *
    * @param dataCenter 数据中心
    * @return 物理主机列表
    */
  def getHostsToTurnoff(implicit dataCenter: DataCenter): Iterable[Host]
}
